package org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.futbolista;

import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.Balon;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.PosicionBalon;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.PosicionCampo;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.PosicionDespeje;
import org.javahispano.javacup.tacticas_aceptadas.jcrosas.chuky.util.PosicionFutura;


/**
 * @author Joan Crosas
 *
 */
public interface FutbolistaBase {
	
	public static final int SEGURIDAD_PASE_MUY_ALTA = 4;
	public static final int SEGURIDAD_PASE_ALTA = 3;
	public static final int SEGURIDAD_PASE_MEDIA = 2;
	public static final int SEGURIDAD_PASE_BAJA = 1;
	public static final int SEGURIDAD_AUTOPASE = 2;
	public static final int SEGURIDAD_PASE_MIN = 0;
	
	public static final double DISTANCIA_AVANZADA_PASE_MIN = -6.0;
	
	public static final double IMPORTANCIA_PORTERO = 0.0;
	public static final double IMPORTANCIA_DEFENSA = 0.2;
	public static final double IMPORTANCIA_LATERAL = 0.5;
	public static final double IMPORTANCIA_CENTRO = 0.7;
	public static final double IMPORTANCIA_DELANTERO = 1.0;
	
	
	public static final double DISTANCIA_MAX_VIGILAR_BALON = 28.0;
	public static final double DISTANCIA_MAX_PASE_DEFENSIVO = 38.0;
	public static final double DISTANCIA_MAX_PASE = 50.0;
	public static final double DISTANCIA_MIN_PASE = 8.0;
	public static final double DISTANCIA_MAX_CHUTE_PORTERIA = 38.0;
	public static final int TIEMPO_MAX_CONTROL_BALON = 28;
	public static final int TIEMPO_MAX_PASE = 40;
	public static final int TIEMPO_ANTICIPACION_PASE = 10;
	public static final int TIEMPO_MAX_SIN_GOLPEAR_BALON = 8;
	public static final double ANGULO_VERTICAL = 36 * Math.PI / 180;
	public static final double ANGULO_VERTICAL_DESPEJE = 46 * Math.PI / 180;
	public static final double ANGULO_VERTICAL_MAX = 56 * Math.PI / 180;
	public static final double ANGULO_VERTICAL_MIN = 0.0;
	
	public static final double DESVIO_ANGULO_PASE = Math.PI / 32; 
	public static final double[] POTENCIA_PASE_DEFENSIVO = { 1.0, 1.0, 1.0, 1.0, 1.0, 0.8 }; 
	public static final double[] ANGULO_PASE_DEFENSIVO = { 36*Math.PI/180, 24*Math.PI/180, 16*Math.PI/180, 9*Math.PI/180, 0, 0 }; 
	
	public static final double DESVIO_ANGULO_AUTOPASE = Math.PI / 16;
	public static final double DIVISIONES_POTENCIA_AUTOPASE = 4;
	public static final int DIVISONES_ANGULO_DESPEJE = 32;

	public static final double DISTANCIA_PORTERIA_AUTOPASE = 35.0;
	public static final double DISTANCIA_DEFENSIVA = 76.0;
	public static final double DISTANCIA_DEFENSIVA_MEDIA = 42.0;
	public static final double DISTANCIA_DEFENSIVA_LATERAL = 46.0;
	public static final double DISTANCIA_DEFENSIVA_CRITICA = 36.0;
	public static final double DISTANCIA_PRESION_OPONENTE = 0.5;
	public static final int TIEMPO_MAX_PRESION_DEFENSIVA = 6;
	public static final int FUTBOLISTAS_MAX_PRESION_DEFENSIVA = 3;
	
	public static final PosicionCampo POSICION_PORTERIA = new PosicionCampo( Constantes.centroArcoInf );
	public static final PosicionCampo POSICION_PORTERIA_RIVAL = new PosicionCampo( Constantes.centroArcoSup );
	public static final PosicionCampo POSICION_CORNER_IZQ = new PosicionCampo( Constantes.cornerInfIzq );
	public static final PosicionCampo POSICION_CORNER_DER = new PosicionCampo( Constantes.cornerInfDer );
	public static final PosicionCampo POSICION_POSTE_DER = new PosicionCampo( Constantes.posteDerArcoInf );
	public static final PosicionCampo POSICION_POSTE_IZQ = new PosicionCampo( Constantes.posteIzqArcoInf );
	public static final PosicionCampo POSICION_POSTE_DER_RIVAL = new PosicionCampo( Constantes.posteDerArcoSup );
	public static final PosicionCampo POSICION_POSTE_IZQ_RIVAL = new PosicionCampo( Constantes.posteIzqArcoSup );
	
	public static final PosicionCampo POSICION_BASE_PORTERO = new PosicionCampo( 0.0, -(Constantes.LARGO_CAMPO_JUEGO/2) - 2.0 );
	public static final double POSICION_BASE_PORTERO_X = (Constantes.LARGO_ARCO/2) - 1.0;
	public static final double POSICION_BASE_PORTERO_Y = -(Constantes.LARGO_CAMPO_JUEGO/2) + 1.8;
	public static final double POSICION_BASE_PORTERO_CRITICA_X = (Constantes.LARGO_ARCO/2) - 1.5;
	public static final double POSICION_BASE_PORTERO_CRITICA_Y = -(Constantes.LARGO_CAMPO_JUEGO/2) + 0.6;
	
	public static final int JUGADA_MORTAL_TIEMPO_INICIO = 19;
	public static final int JUGADA_MORTAL_TIEMPO_PREPARACION_INICIO = 31;
	public static final int JUGADA_MORTAL_IN_EXTREMIS_TIEMPO_INICIO = 26;
	public static final PosicionCampo JUGADA_MORTAL_POSICION_BALON = new PosicionCampo( 0.0, (Constantes.LARGO_CAMPO_JUEGO/2) - 1.2 );
	public static final PosicionCampo JUGADA_MORTAL_POSICION_BALON_IN_EXTREMIS = new PosicionCampo( 0.0, (Constantes.LARGO_CAMPO_JUEGO/2) - 1.6 );
	public static final double JUGADA_MORTAL_ERROR_MAX = 1.2;
	public static final double JUGADA_MORTAL_IN_EXTREMIS_ERROR_MAX = 1.6;
	public static final double JUGADA_MORTAL_ALTURA = Constantes.ALTO_ARCO;
	public static final double JUGADA_MORTAL_ANGULO_VERTICAL_MIN = 30 * Math.PI / 180;
	public static final double JUGADA_MORTAL_ANGULO_VERTICAL = 45 * Math.PI / 180;
	public static final double JUGADA_MORTAL_ANGULO_VERTICAL_MAX = 60 * Math.PI / 180;
	
	
	public int getNumero();
	public int getIndice();
	public double getRemate();
	public double getVelocidad();
	public double getPrecision();
	public PosicionCampo getPosicion();
	public Rol getRol();
	public int getIteracionesParaRematar();
	public boolean isPortero();
	
	public PosicionFutura puedoInterceptar( Balon balon );
	public PosicionFutura puedoInterceptarPase( Balon balon );
	public PosicionFutura podreInterceptarPase( Balon balon, int tiempoAnticipacion, boolean autpase );
	public PosicionDespeje podreInterceptarDespeje( Balon balon );
	public double distanciaRecorrida( int tiempo );
	public boolean balonEncima( Balon balon );
	public boolean balonEncima( PosicionBalon posicionBalon, int t );
	public boolean balonInterceptable( PosicionBalon posicionBalon );

}
